const koaRouter = require('koa-router');
const request = require('request');
const memoryCache = require('memory-cache');
let config = require('../../config/pay_info');
config = config.wx;
const common = require('../../common/index');
const util = require('../../utils/util');
const createHash = require('create-hash');
const dao = require('../common/db');

const router = new koaRouter({
    prefix: '/api/wechat'
});

router.get('/test', async ctx => {
    ctx.body = {
        name: 'hello'
    }; 
});

/**
 * 用户授权登录
 */
router.get('/redirect', async ctx => {
    let redirectUrl = ctx.request.query.url,
        scope = ctx.request.query.scope,
        callback = 'http://www.kaiyouservices.com/api/wechat/getOpenId';
    memoryCache.put('redirectUrl', redirectUrl);
    let authorizeUrl = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${config.APP_ID}&redirect_uri=${callback}&response_type=code&scope=${scope}&state=STATE#wechat_redirect`;
    ctx.redirect(authorizeUrl);
});

/**
 * 根据code获取用户的openId
 */
router.get('/getOpenId', async ctx => {
    let code = ctx.request.query.code;
    console.log('获取到的授权code为：', code);
    
    if (!code) {
        ctx.body = util.handleFail('当前未获取到授权code码！');
    } else {
        // 获取openId
        let result = await common.getAccessToken(code);
        if (result.code == 0) {
            // 2小时
            let expire_time = 2 * 60 * 60 * 1000;
            memoryCache.put('access_token', result.responseData.access_token);
            memoryCache.put('openId', result.responseData.openid);
            ctx.cookies.set('openId', result.responseData.openid, {
                maxAge: expire_time,
                // 将只读模式关掉
                httpOnly: false
            });

            // 这里存下下面要使用到的openId
            let openId = result.responseData.openid;

            // 根据数据库里到底有没有openId去判定到底要不要向数据库里插入数据
            let usersRes = await dao.query({ openid: openId }, 'users');

            if (usersRes.code == 0) {
                // 表示查询到有数据
                if (usersRes.responseData.length > 0) {
                    // 获取到openId并且设置好之后，再通过在缓存里取到重定向的地址，再跳转回去
                    let redirectUrl = memoryCache.get('redirectUrl');
                    ctx.redirect(redirectUrl);
                // 没有查询到数据，那么将用户授权成功的信息保存到数据里
                } else {
                    // 获取到用户信息
                    let usersData = await common.getUserInfo(result.responseData.access_token, openId);
                    let insertData = await dao.insert(usersData.responseData, 'users');
                    if (insertData.code == 0) {
                        // 获取到openId并且设置好之后，再通过在缓存里取到重定向的地址，再跳转回去
                        let redirectUrl = memoryCache.get('redirectUrl');
                        ctx.redirect(redirectUrl);
                    } else {
                        ctx.body = insertData;
                    }
                }
            } else {
                ctx.body = usersRes;
            }
        } else {
            ctx.body = result;
        }
    }
});

// 获取用户信息
router.get('/getUserInfo', async ctx => {
    let access_token = memoryCache.get('access_token');
    let openId = memoryCache.get('openId');
    let result = await common.getUserInfo(access_token, openId);
    ctx.body = result;
});

// 获取jssdk接口
router.get('/jssdk', async ctx => {
    // 前端传递过来的不包含#以及后面的地址部分，用来进行生成签名的
    let url = ctx.request.query.url;

    let result = await common.getBasicToken();

    if (result.code == 0) {
        let token = result.responseData.access_token;
        // 缓存存起来
        memoryCache.put('token', token);

        let result2 = await common.getJSAPITicket(token);

        if (result2.code == 0) {
            // 定义要签名的参数
            let params = {
                noncestr: util.createNonceStr(),
                jsapi_ticket: result2.responseData.ticket,
                timestamp: util.createTimestamp(),
                url
            };

            let str = util.raw(params);
            console.log('str串：' + str);

            // 对str串进行sha加密
            let sign = createHash('sha1').update(str).digest('hex');

            // 那么现在可以返回给前端了
            ctx.body = {
                // 必填，公众号的唯一标识
                appId: config.APP_ID, 
                // 必填，生成签名的时间戳
                timestamp: params.timestamp,
                // 必填，生成签名的随机串
                nonceStr: params.noncestr,
                // 必填，签名
                signature: sign,
                // 必填，需要使用的JS接口列表
                jsApiList: [
                    // 即将废弃分享接口
                    'onMenuShareTimeline',
                    'onMenuShareAppMessage',
                    'onMenuShareQQ',
                    'onMenuShareQZone',
                    // 新版分享接口
                    'updateAppMessageShareData',
                    'updateTimelineShareData'
                ]
            };
        } else {
            ctx.body = result2;
        }
    } else {
        ctx.body = result;
    }
});

module.exports = router;
